///<reference types="node"/>

// Load native UI library
// See docs: https://github.com/rogerwang/node-webkit/wiki/Shell
import gui = require("nw.gui");


/* WINDOW */

// Get the current window
var win = gui.Window.get();

// Listen to the minimize event
win.on('minimize', function() {
    console.log('Window is minimized');
});

// Minimize the window
win.minimize();

// Unlisten the minimize event
win.removeAllListeners('minimize');

// Create a new window and get it
var new_win = gui.Window.get(
    window.open('https://github.com')
);

// And listen to new window's focus event
new_win.on('focus', function() {
    console.log('New window is focused');
});


// Get the current window
var win = gui.Window.get();

// Create a new window and get it
var new_win = gui.Window.get(
    window.open('https://github.com')
);

// png as base64string
win.capturePage(function(base64string: string) {
    // do something with the base64string
}, { format: 'png', datatype: 'raw' });

// png as node buffer
win.capturePage(function(buffer: Buffer) {
    // do something with the buffer
}, { format: 'png', datatype: 'buffer' });


// Open a new window.
var win = gui.Window.get(
    window.open('popup.html')
);

// Release the 'win' object here after the new window is closed.
win.on('closed', function() {
    win = null;
});

// Listen to main window's close event
gui.Window.get().on('close', function() {
    // Hide the window to give user the feeling of closing immediately
    this.hide();

    // If the new window is still open then close it.
    if (win != null)
        win.close(true);

    // After closing the new window, close the main window.
    this.close(true);
});


/* MENU */

// Create an empty menu
var menu = new gui.Menu();

// Add some items
menu.append(new gui.MenuItem({ label: 'Item A' }));
menu.append(new gui.MenuItem({ label: 'Item B' }));
menu.append(new gui.MenuItem({ type: 'separator' }));
menu.append(new gui.MenuItem({ label: 'Item C' }));

// Remove one item
menu.removeAt(1);

// Popup as context menu
menu.popup(10, 10);

// Iterate menu's items
for (var i = 0; i < menu.items.length; ++i) {
    console.log(menu.items[i]);
}


var win = gui.Window.get();
var nativeMenuBar = new gui.Menu({ type: "menubar" });
nativeMenuBar.createMacBuiltin("My App");
win.menu = nativeMenuBar;

nativeMenuBar.createMacBuiltin("My App", {
    hideEdit: true,
    hideWindow: true
});

/* MENU ITEM */

var itemc: gui.MenuItem;

// Create a separator
itemc = new gui.MenuItem({ type: 'separator' });

// Create a normal item with label and icon
itemc = new gui.MenuItem({
    type: "normal",
    label: "I'm a menu item",
    icon: "img/icon.png"
});

// Or you can omit the 'type' field for normal items
itemc = new gui.MenuItem({ label: 'Simple item' });

// Bind a callback to item
itemc = new gui.MenuItem({
    label: "Click me",
    click: function() {
        console.log("I'm clicked");
    },
    key: "s",
    modifiers: "ctrl-alt",
});

// You can have submenu!
var submenu = new gui.Menu();
submenu.append(new gui.MenuItem({ label: 'Item 1' }));
submenu.append(new gui.MenuItem({ label: 'Item 2' }));
submenu.append(new gui.MenuItem({ label: 'Item 3' }));
itemc.submenu = submenu;

// And everything can be changed at runtime
itemc.label = 'New label';
itemc.click = function() { console.log('New click callback'); };


/* APP */

// Print arguments
console.log(gui.App.argv);

// Quit current app
gui.App.quit();

// Get the name field in manifest
gui.App.manifest.name

gui.App.addOriginAccessWhitelistEntry('https://github.com/', 'app', 'myapp', true);


/* CLIPBOARD */

// We can not create a clipboard, we have to receive the system clipboard
var clipboard = gui.Clipboard.get();

// Read from clipboard
var text = clipboard.get('text');
console.log(text);

// Or write something
clipboard.set('I love node-webkit :)', 'text');

// And clear it!
clipboard.clear();


/* TRAY */

// Create a tray icon
var tray = new gui.Tray({ title: 'Tray', icon: 'img/icon.png' });

// Give it a menu
var menu = new gui.Menu();
menu.append(new gui.MenuItem({ type: 'checkbox', label: 'box1' }));
tray.menu = menu;

// Remove the tray
tray.remove();
tray = null;


/* SHELL */

// Open URL with default browser.
gui.Shell.openExternal('https://github.com/rogerwang/node-webkit');

// Open a text file with default text editor.
gui.Shell.openItem('test.txt');

// Open a file in file explorer.
gui.Shell.showItemInFolder('test.txt');